شناسایی و حذف دیتای تکراری در حجم بالا

شناسایی و حذف دیتای تکراری در حجم بالا


در تمیز کردن دیتای حجیم، یکی از چالش های اصلی، شناسایی و مدیریت رکوردهای تکراری است. اکثرا از GROUP BY یا DISTINCT استفاده می کنند که ممکن است باعث از دست دادن داده یا عملکرد ضعیف شود.

با استفاده از توابعی مثل ROW_NUMBER() می توان duplicatesها را بر اساس یک کلید منطقی (مثلاً ترکیب چند ستون) شماره گذاری و سپس فقط رکوردهای منحصر به فرد را حفظ کنید.

مثال: فرض کنید جدول Orders با داده های حجیم دارید و می خواهید رکوردهای تکراری بر اساس CustomerID و OrderDate حذف کنید، اما تنها آخرین رکورد (بر اساس OrderID) نگهداری شود:

WITH CTE_Deduplicate AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY CustomerID, OrderDate 
            ORDER BY OrderID DESC
        ) AS RN
    FROM Orders
)
DELETE FROM CTE_Deduplicate 
WHERE RN > 1;

چرا این تکنیک بهینه است؟

  • سرعت بالا: پردازش داده در حافظه (مخصوصاً در نسخه های جدید SQL Server).
  • انعطاف پذیری: می توانید بر اساس هر معیاری (مثلاً ORDER BY OrderID DESC) داده اصلی را حفظ کنید.
  • کمترین قفل کردن جدول: با استفاده از CTE و حذف هدفمند، از قفل شدن کل جدول جلوگیری می شود.

نکات تکمیلی برای داده های حجیم:

  • قبل از حذف، با استفاده از SELECT در CTE نتیجه را بررسی کنید.
  • از ایندکس موقت روی ستون های PARTITION BY و ORDER BY برای بهبود عملکرد کمک بگیرید.
  • اگر جدول بسیار بزرگ است، حذف را دسته ای (Batch) انجام دهید:

WHILE EXISTS (SELECT 1 FROM Orders WHERE RN > 1)
BEGIN
    DELETE TOP (10000) FROM CTE_Deduplicate WHERE RN > 1;
END;

سید حامد واحدی سید حامد واحدی     31 مرداد 1404